有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何正确使用如此多的CPU停止命令队列循环?

我有一个while循环,用于检查包含程序要执行的命令的arraylist是否为空。很明显,如果它不是空的,它会做一些事情,但是如果它现在是空的,我只有一个线程。为其他人睡眠(1000)。这使得任何与之交互的东西都变得相当迟钝。在添加新命令之前,有没有办法阻止它运行的线程?(它在自己的线程中运行,所以对我来说这似乎是最好的解决方案)或者有更好的解决方案吗


共 (3) 个答案

  1. # 1 楼答案

    更好的解决方案是使用Executor服务。这结合了一个队列和一个线程池

    // or use a thread pool with multiple threads.
    ExecutorService executor = Executors.newSingleThreadExecutor();
    
    // call as often as you like.    
    executor.submit(new Runnable() {
        @Override
        public void run() {
            process(string);
        }
    });
    
    // when finished
    executor.shutdown();
    
  2. # 2 楼答案

    您可以使用wait()notify()向列表中添加内容的线程通知消费者线程有需要读取的内容。然而,这需要适当的同步等

    但是解决问题的更好方法是使用BlockingQueue。根据定义,它们是同步类,当添加内容时,出列将被适当地阻止并唤醒。如果希望队列不受限制,那么^{}是一个很好的类。当您希望在队列中存储有限数量的项时(或者LinkedBlockingQueue将整数传递给构造函数),可以使用^{}。如果队列有限,那么queue.add(...)将在队列已满时阻塞

    BlockingQueue<Message> queue = new LinkedBlockingQueue<Messsage>();
    ...
    // producer thread(s) add a message to the queue
    queue.add(message);
    ...
    // consumer(s) wait for a message to be added to the queue and then removes it
    Message message = queue.take();
    ...
    // you can also wait for certain amount of time, returns null on timeout
    Message message = queue.poll(10, TimeUnit.MINUTES);
    
  3. # 3 楼答案

    在命令中使用^{}
    在上面的链接中有一个很好的例子说明了如何使用它